/*2、使用英文小写字母随机生成一个大于3个字符的字符串并打印，请再把这个字符串逆序打印出来*/

package main

import (
	"fmt"
	"math/rand"
	"time"
)

// 优化1:全局的随机数生成器，防止反复调用函数重新生成
var r = rand.New(rand.NewSource(time.Now().UnixNano()))

// 随机N字符字符串
func randomNChar(n int) string {
	b := make([]byte, n)
	// b := make([]byte, 0, n)
	// r := rand.New(rand.NewSource(time.Now().UnixNano()))
	// for i := 0; i < n; i++ {
	// 	b = append(b, byte(r.Intn(26)+97))
	// }
	// 优化2： 不使用append，直接range遍历索引赋值
	for i := range b {
		b[i] = byte(r.Intn(26) + 97)
	}
	return string(b)
}

// 字符串翻转
func reverseString(s string) string {
	length := len(s)
	reverseS := []byte(s)
	// b := make([]byte, 0, length)
	// for i := length - 1; i >= 0; i-- {
	// 	b = append(b, s[i])
	// }
	// 优化3：不遍历整个字符串，使用双指针，只需要遍历至多一半
	for i, j := 0, length-1; i < j; i, j = i+1, j-1 {
		reverseS[i], reverseS[j] = reverseS[j], reverseS[i]
	}
	return string(reverseS)
}

func main() {
	s := randomNChar(20)
	fmt.Println(s)
	fmt.Printf("reverseString(s): %v\n", reverseString(s))
}
